package cn.kgc.spring.factory;

import cn.hutool.core.convert.Convert;
import cn.kgc.spring.annotations.Component;
import cn.kgc.spring.annotations.Value;

import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/**
 * @author 课工场
 * @date 2024/2/21
 * @description  实例工厂对象  实例化添加了Component指定注解的对象
 */
public class BeanFactory {

    public static Object  getBean(Class tclass){

        try {
            // 判定类上是否添加了component注解
            Annotation annotation = tclass.getAnnotation(Component.class);
            if (annotation==null){
                System.out.println("没有指定注解，无法创建对象");
                return null;
            }
            Constructor declaredConstructor = tclass.getDeclaredConstructor();
            Object o = declaredConstructor.newInstance();

            // 获取类中所有的属性  遍历 查看属性上是否含有Value注解
            Field[] declaredFields = tclass.getDeclaredFields();
            if (declaredFields!=null){
                for (Field declaredField : declaredFields) {
                    Value annotation1 = declaredField.getAnnotation(Value.class);
                    if (annotation1!=null){
                        //通过注解属性 获取属性的需要赋值的参数
                        String value = annotation1.value();
                        //  获取属性类型
                        Class<?> type = declaredField.getType();
                        //转换数据类型  String -> type
                        Object o1 = Convert.convertQuietly(type, value);
                        // 提升反射操作私有属性的权限
                        declaredField.setAccessible(true);
                        declaredField.set(o,o1);
                    }
                }
            }
            return o;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
